# IO 基础 快速入门

## 1. 概述

IO（Input/Output）是计算机系统中数据输入和输出的过程，是程序与外部世界（文件、网络、设备等）交互的基础。

## 2. 按照硬件类型划分

### 技术术语

- **数据源**：数据的来源（文件、网络、内存、CPU 等）
- **数据流向**：输入流（读取）、输出流（写入）
- **数据传输方式**：字节流、字符流
- **缓冲机制**：提高 IO 效率的重要技术

### 数据源对比

| 分类           | 描述               | 核心类                                                                | 读写速率                                                                                 | 特点                                                                         | 适用场景                               |
| -------------- | ------------------ | --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | -------------------------------------- |
| **CPU/寄存器** | 处理器内部数据操作 | 直接操作指令                                                          | 1-10 ns<br />~100 GB/s                                                                   | • 速度最快<br />• 容量最小<br />• 直接硬件操作<br />• 零延迟                 | 算术运算<br />逻辑判断<br />控制流程   |
| **内存 IO**    | 内存数据读写       | `ByteArrayInputStream`<br />`ByteArrayOutputStream`<br />`ByteBuffer` | 10-100 ns<br />10-50 GB/s                                                                | • 速度极快<br />• 数据易失性<br />• 临时性存储<br />• 无需序列化             | 缓存数据<br />临时计算<br />对象序列化 |
| **磁盘 IO**    | 文件系统读写       | `FileInputStream`<br />`FileOutputStream`<br />`FileChannel`          | 1-10 ms (机械)<br />0.1-1 ms (SSD)<br />100-600 MB/s (SATA SSD)<br />1-7 GB/s (NVMe SSD) | • 数据持久化<br />• 支持随机访问<br />• 寻道时间影响<br />• 容量大           | 文件存储<br />数据库<br />日志记录     |
| **网络 IO**    | 网络数据传输       | `Socket`<br />`ServerSocket`<br />`HttpURLConnection`                 | 1-100 ms (延迟)<br />1 Mbps - 100 Gbps (带宽)<br />实际 10-1000 MB/s                     | • 受网络质量影响<br />• 数据分包传输<br />• 需要协议处理<br />• 异步特性明显 | Web 服务<br />API 调用<br />微服务通信 |
| **设备 IO**    | 外设数据交互       | `System.in`<br />`System.out`<br />USB/串口类                         | 0.1-10 ms<br />1-100 MB/s                                                                | • 实时性要求高<br />• 协议多样化<br />• 驱动依赖<br />• 中断处理             | 键盘输入<br />打印输出<br />传感器数据 |

### 基于速率差异的优化策略

| 数据源       | 优化策略                                               | 技术实现                                                         |
| ------------ | ------------------------------------------------------ | ---------------------------------------------------------------- |
| **CPU/内存** | • 减少上下文切换<br />• 优化缓存命中<br />• 使用对象池 | `ThreadLocal`<br />`ObjectPool`<br />缓存对齐                    |
| **磁盘 IO**  | • 使用缓冲区<br />• 异步写入<br />• 批量操作           | `BufferedInputStream`<br />`FileChannel`<br />`MappedByteBuffer` |
| **网络 IO**  | • 连接复用<br />• 数据压缩<br />• 异步非阻塞           | `HttpClient`连接池<br />`GZIP压缩`<br />`NIO/Netty`              |

## 3. IO 类型

### BIO/NIO/AIO 对比

| 特性维度       | BIO (Blocking I/O)                               | NIO (Non-blocking I/O)                             | AIO (Asynchronous I/O)                               |
| -------------- | ------------------------------------------------ | -------------------------------------------------- | ---------------------------------------------------- |
| **全称**       | Blocking I/O<br />阻塞式 I/O                     | Non-blocking I/O<br />非阻塞式 I/O                 | Asynchronous I/O<br />异步 I/O                       |
| **核心机制**   | 同步阻塞                                         | 同步非阻塞                                         | 异步非阻塞                                           |
| **线程模型**   | 1 连接 : 1 线程<br />线程阻塞等待                | 1 线程 : N 连接<br />多路复用                      | 回调驱动<br />Proactor 模式                          |
| **数据准备**   | 阻塞直到数据就绪                                 | 立即返回状态<br />可做其他事情                     | 立即返回<br />内核完成后通知                         |
| **数据拷贝**   | 同步拷贝<br />用户线程参与                       | 同步拷贝<br />用户线程参与                         | 异步拷贝<br />内核完成拷贝                           |
| **编程复杂度** | 🟢 简单直观                                      | 🟡 复杂                                            | 🟡 中等                                              |
| **性能表现**   | 连接数少时良好<br />连接数多时差                 | 高并发场景优秀                                     | 高并发+长耗时优秀                                    |
| **资源消耗**   | 高（线程资源）                                   | 低                                                 | 低                                                   |
| **JDK 版本**   | JDK 1.0+                                         | JDK 1.4+                                           | JDK 1.7+                                             |
| **适用场景**   | • 连接数较少<br />• 快速原型开发<br />• 内部系统 | • 高并发服务端<br />• 聊天服务器<br />• 游戏服务器 | • 文件 IO 密集型<br />• 长连接服务<br />• 大数据处理 |

### 阻塞方式详细对比

| 阶段             | BIO                               | NIO                               | AIO                                 |
| ---------------- | --------------------------------- | --------------------------------- | ----------------------------------- |
| **等待数据就绪** | 🔴 阻塞等待<br />线程挂起         | 🟡 非阻塞轮询<br />立即返回状态   | 🟢 异步等待<br />立即返回，回调通知 |
| **数据拷贝**     | 🔴 同步拷贝<br />用户线程参与拷贝 | 🔴 同步拷贝<br />用户线程参与拷贝 | 🟢 异步拷贝<br />内核完成拷贝后通知 |
| **线程状态**     | 运行 → 阻塞 → 运行                | 运行 → 运行 → 运行                | 运行 → 运行（回调）                 |

### 性能特征对比

| 指标           | BIO                | NIO                | AIO                |
| -------------- | ------------------ | ------------------ | ------------------ |
| **CPU 利用率** | 低（线程阻塞）     | 高（轮询消耗）     | 高（无阻塞）       |
| **内存占用**   | 高（每线程栈内存） | 低（共享线程）     | 低（共享线程）     |
| **吞吐量**     | 低（线程数限制）   | 高（连接数不受限） | 高（连接数不受限） |
| **延迟**       | 稳定但较高         | 较低但波动         | 最低               |

## 4. IO 的线程模型

线程模型决定了如何**组织和管理线程**来处理 IO 操作，直接影响系统的**性能、吞吐量和资源利用率**。

### 线程模型的核心价值

| 维度           | 意义               | 影响                                   |
| -------------- | ------------------ | -------------------------------------- |
| **CPU 利用率** | 避免线程空转和阻塞 | 减少上下文切换，提高 CPU 处理效率      |
| **内存消耗**   | 控制线程栈内存占用 | 每个线程都需要独立的栈空间(通常 1-2MB) |
| **并发能力**   | 支撑的连接数规模   | 线程数 vs 连接数的比例关系             |
| **响应延迟**   | 请求处理的时间分布 | 线程调度和任务排队的影响               |
| **编程复杂度** | 开发维护的难易程度 | 并发控制、线程安全的管理成本           |

### 线程模型常见分类

| 线程模型                          | 核心思想                                  | 适用场景                                                            | 优缺点                                                                                                                                         |
| --------------------------------- | ----------------------------------------- | ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| **阻塞 IO 模型**<br/>(BIO)        | 一个连接一个线程<br/>同步阻塞处理         | - 连接数较少(小于 1000)<br/>- 传统企业应用<br/>- 简单的 HTTP 服务器 | **优点:**<br/>- 编程简单直观<br/>- 调试方便<br/>- 线程隔离性好<br/>**缺点:**<br/>- 线程资源消耗大<br/>- 并发能力有限<br/>- 上下文切换开销大    |
| **Reactor 模式**<br/>(NIO)        | 事件驱动<br/>IO 操作与业务处理分离        | - 高并发网络服务<br/>- 大量短连接场景<br/>- 实时通信系统            | **优点:**<br/>- 单线程处理多连接<br/>- 资源利用率高<br/>- 扩展性好<br/>**缺点:**<br/>- 编程复杂度高<br/>- 回调地狱风险<br/>- 调试困难          |
| **主从 Reactor 模式**<br/>(Netty) | 连接接收与 IO 处理分离<br/>多线程分工协作 | - 超高并发场景<br/>- 游戏服务器<br/>- 金融交易系统<br/>- 消息中间件 | **优点:**<br/>- 职责分离明确<br/>- 性能极致优化<br/>- 支持海量连接<br/>**缺点:**<br/>- 架构复杂<br/>- 学习成本高<br/>- 调优难度大              |
| **Proactor 模式**<br/>(AIO)       | 异步回调<br/>操作系统完成 IO 操作         | - 大规模文件操作<br/>- 高性能代理服务器<br/>- Windows 平台应用      | **优点:**<br/>- 真正的异步非阻塞<br/>- 线程利用率最高<br/>- 无阻塞等待<br/>**缺点:**<br/>- 平台依赖性<br/>- 编程模型复杂<br/>- 调试困难        |
| **Worker 线程池模型**             | IO 线程+业务线程池<br/>分工处理           | - 计算密集型业务<br/>- 需要阻塞操作的场景<br/>- 传统系统改造        | **优点:**<br/>- IO 与业务解耦<br/>- 避免 IO 线程阻塞<br/>- 资源分配灵活<br/>**缺点:**<br/>- 数据传递开销<br/>- 线程上下文切换<br/>- 复杂度增加 |

## 5. Java IO 生态圈

### 现代 IO 框架对比

| 框架         | IO 类型 | 网络/磁盘 IO                                      | IO 模型          | 核心特性                                                         | 适用场景                                 |
| ------------ | ------- | ------------------------------------------------- | ---------------- | ---------------------------------------------------------------- | ---------------------------------------- |
| **Java BIO** | BIO     | 网络 IO                                           | -                | 同步阻塞<br />简单易用<br />线程 per connection                  | 传统客户端应用<br />低并发服务器         |
| **Java NIO** | NIO     | 网络/磁盘 IO                                      | Reactor          | Selector 多路复用<br />非阻塞 IO<br />内存映射文件               | 高并发网络服务<br />文件高效读写         |
| **Java AIO** | AIO     | 网络/磁盘 IO                                      | Proactor         | 异步回调<br />CompletionHandler<br />Future 模式                 | 高性能网络应用<br />大规模文件操作       |
| **Netty**    | NIO     | **主要网络 IO**<br />支持磁盘 IO(通过 FileRegion) | **主从 Reactor** | 事件驱动<br />零拷贝<br />丰富的协议支持<br />线程模型灵活       | 游戏服务器<br />RPC 框架<br />消息中间件 |
| **Mina**     | NIO     | **主要网络 IO**<br />有限磁盘 IO 支持             | **Reactor**      | NIO 框架<br />线程模型优化<br />协议编码解码<br />过滤器链       | 网络应用<br />通信服务器                 |
| **Grizzly**  | NIO     | **主要网络 IO**<br />支持磁盘 IO(静态文件)        | **Reactor**      | NIO 框架<br />GlassFish 服务器使用<br />高性能<br />内存管理优化 | Web 服务器<br />应用服务器               |
